<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>

<script>
    /*

    vue双向数据綁定原理，又称vue响应式原理，是vue的核心，双向数据綁定是通过数据劫持结合发布订阅模式的方式来实现的，也就
    是说数据和视图同步，数据发生变化，视图跟着变化，视图变化，数据也随之发生改变
1.2 vue双向数据綁定原理的实现，其核心是 Object defineProperty方法

1.3 Object defineProperty(obj, prop, descriptor方法，接收三个参数，分别为obj(定义其上属性的对象）prop(定义或修改的属性）
descriptor(具体的改变方法)，就是用这个方法来定义一个值，当调用时我们使用了它里面的get方法，当我们给这个属性赋值时，又用到了它里面的set方法
vue3监听的是整个对象 vue2中监听的是属性


说一说JavaScript内存泄漏有几种情况
通常情况下有两种实现方式标记清除和引用计数
js中的内存垃圾回收机制：垃圾回收器会定期扫描内存，当某个内存中的值被引用为零时就会将其回收。
当前变量已经使用完毕但依然被引用，导致垃圾回收器无法回收这就造成了内存泄漏。
标记清除：当变量进入环境时就会被标记为进入环境 当变量离开环境时就会标记为离开环境
引用计数：语言引擎有一张引用次数表如果一个值得引用次数为0时就表示这个值不在用到，垃圾回收不再引用的值
常见的内存泄漏
闭包 定时器 意外的全局变量   dom对象与js对象互相引用

        JavaScript如何实现继承 继承的方式有很多种主要分为es5和es6
        es5实现继承：
                1.原型链继承直接 子类点prototype=new 父类
                2.盗用构造函数继承使用call apply的方式实现继承 在子类里父类.call/apply 然后再外面let一个新的变量new子类
                3.组合继承结合原型链继承和盗用构造函数继承来实现组合继承
        es6实现继承：
        先用class定义一个类 用extends继承类 用super表示父类

    */
  for (let i = 0; i <1000000000; i++) {
        console.log(i);
  }
</script>